home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / test / test_minidom.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  46KB  |  1,265 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import os
  5. import sys
  6. import pickle
  7. import traceback
  8. from StringIO import StringIO
  9. from test.test_support import verbose
  10. import xml.dom as xml
  11. import xml.dom.minidom as xml
  12. import xml.parsers.expat as xml
  13. from xml.dom.minidom import parse, Node, Document, parseString
  14. from xml.dom.minidom import getDOMImplementation
  15. if __name__ == '__main__':
  16.     base = sys.argv[0]
  17. else:
  18.     base = __file__
  19. tstfile = os.path.join(os.path.dirname(base), 'test' + os.extsep + 'xml')
  20. del base
  21.  
  22. def confirm(test, testname = 'Test'):
  23.     if not test:
  24.         print 'Failed ' + testname
  25.         raise Exception
  26.     
  27.  
  28.  
  29. def testParseFromFile():
  30.     dom = parse(StringIO(open(tstfile).read()))
  31.     dom.unlink()
  32.     confirm(isinstance(dom, Document))
  33.  
  34.  
  35. def testGetElementsByTagName():
  36.     dom = parse(tstfile)
  37.     confirm(dom.getElementsByTagName('LI') == dom.documentElement.getElementsByTagName('LI'))
  38.     dom.unlink()
  39.  
  40.  
  41. def testInsertBefore():
  42.     dom = parseString('<doc><foo/></doc>')
  43.     root = dom.documentElement
  44.     elem = root.childNodes[0]
  45.     nelem = dom.createElement('element')
  46.     root.insertBefore(nelem, elem)
  47.     if len(root.childNodes) == 2 and root.childNodes.length == 2 and root.childNodes[0] is nelem and root.childNodes.item(0) is nelem and root.childNodes[1] is elem and root.childNodes.item(1) is elem and root.firstChild is nelem and root.lastChild is elem:
  48.         pass
  49.     confirm(root.toxml() == '<doc><element/><foo/></doc>', 'testInsertBefore -- node properly placed in tree')
  50.     nelem = dom.createElement('element')
  51.     root.insertBefore(nelem, None)
  52.     if len(root.childNodes) == 3 and root.childNodes.length == 3 and root.childNodes[1] is elem and root.childNodes.item(1) is elem and root.childNodes[2] is nelem and root.childNodes.item(2) is nelem and root.lastChild is nelem and nelem.previousSibling is elem:
  53.         pass
  54.     confirm(root.toxml() == '<doc><element/><foo/><element/></doc>', 'testInsertBefore -- node properly placed in tree')
  55.     nelem2 = dom.createElement('bar')
  56.     root.insertBefore(nelem2, nelem)
  57.     if len(root.childNodes) == 4 and root.childNodes.length == 4 and root.childNodes[2] is nelem2 and root.childNodes.item(2) is nelem2 and root.childNodes[3] is nelem and root.childNodes.item(3) is nelem and nelem2.nextSibling is nelem and nelem.previousSibling is nelem2:
  58.         pass
  59.     confirm(root.toxml() == '<doc><element/><foo/><bar/><element/></doc>', 'testInsertBefore -- node properly placed in tree')
  60.     dom.unlink()
  61.  
  62.  
  63. def _create_fragment_test_nodes():
  64.     dom = parseString('<doc/>')
  65.     orig = dom.createTextNode('original')
  66.     c1 = dom.createTextNode('foo')
  67.     c2 = dom.createTextNode('bar')
  68.     c3 = dom.createTextNode('bat')
  69.     dom.documentElement.appendChild(orig)
  70.     frag = dom.createDocumentFragment()
  71.     frag.appendChild(c1)
  72.     frag.appendChild(c2)
  73.     frag.appendChild(c3)
  74.     return (dom, orig, c1, c2, c3, frag)
  75.  
  76.  
  77. def testInsertBeforeFragment():
  78.     (dom, orig, c1, c2, c3, frag) = _create_fragment_test_nodes()
  79.     dom.documentElement.insertBefore(frag, None)
  80.     confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3), 'insertBefore(<fragment>, None)')
  81.     frag.unlink()
  82.     dom.unlink()
  83.     (dom, orig, c1, c2, c3, frag) = _create_fragment_test_nodes()
  84.     dom.documentElement.insertBefore(frag, orig)
  85.     confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3, orig), 'insertBefore(<fragment>, orig)')
  86.     frag.unlink()
  87.     dom.unlink()
  88.  
  89.  
  90. def testAppendChild():
  91.     dom = parse(tstfile)
  92.     dom.documentElement.appendChild(dom.createComment(u'Hello'))
  93.     confirm(dom.documentElement.childNodes[-1].nodeName == '#comment')
  94.     confirm(dom.documentElement.childNodes[-1].data == 'Hello')
  95.     dom.unlink()
  96.  
  97.  
  98. def testAppendChildFragment():
  99.     (dom, orig, c1, c2, c3, frag) = _create_fragment_test_nodes()
  100.     dom.documentElement.appendChild(frag)
  101.     confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3), 'appendChild(<fragment>)')
  102.     frag.unlink()
  103.     dom.unlink()
  104.  
  105.  
  106. def testReplaceChildFragment():
  107.     (dom, orig, c1, c2, c3, frag) = _create_fragment_test_nodes()
  108.     dom.documentElement.replaceChild(frag, orig)
  109.     orig.unlink()
  110.     confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3), 'replaceChild(<fragment>)')
  111.     frag.unlink()
  112.     dom.unlink()
  113.  
  114.  
  115. def testLegalChildren():
  116.     dom = Document()
  117.     elem = dom.createElement('element')
  118.     text = dom.createTextNode('text')
  119.     
  120.     try:
  121.         dom.appendChild(text)
  122.     except xml.dom.HierarchyRequestErr:
  123.         pass
  124.  
  125.     print "dom.appendChild didn't raise HierarchyRequestErr"
  126.     dom.appendChild(elem)
  127.     
  128.     try:
  129.         dom.insertBefore(text, elem)
  130.     except xml.dom.HierarchyRequestErr:
  131.         pass
  132.  
  133.     print "dom.appendChild didn't raise HierarchyRequestErr"
  134.     
  135.     try:
  136.         dom.replaceChild(text, elem)
  137.     except xml.dom.HierarchyRequestErr:
  138.         pass
  139.  
  140.     print "dom.appendChild didn't raise HierarchyRequestErr"
  141.     nodemap = elem.attributes
  142.     
  143.     try:
  144.         nodemap.setNamedItem(text)
  145.     except xml.dom.HierarchyRequestErr:
  146.         pass
  147.  
  148.     print "NamedNodeMap.setNamedItem didn't raise HierarchyRequestErr"
  149.     
  150.     try:
  151.         nodemap.setNamedItemNS(text)
  152.     except xml.dom.HierarchyRequestErr:
  153.         pass
  154.  
  155.     print "NamedNodeMap.setNamedItemNS didn't raise HierarchyRequestErr"
  156.     elem.appendChild(text)
  157.     dom.unlink()
  158.  
  159.  
  160. def testNamedNodeMapSetItem():
  161.     dom = Document()
  162.     elem = dom.createElement('element')
  163.     attrs = elem.attributes
  164.     attrs['foo'] = 'bar'
  165.     a = attrs.item(0)
  166.     confirm(a.ownerDocument is dom, 'NamedNodeMap.__setitem__() sets ownerDocument')
  167.     confirm(a.ownerElement is elem, 'NamedNodeMap.__setitem__() sets ownerElement')
  168.     confirm(a.value == 'bar', 'NamedNodeMap.__setitem__() sets value')
  169.     confirm(a.nodeValue == 'bar', 'NamedNodeMap.__setitem__() sets nodeValue')
  170.     elem.unlink()
  171.     dom.unlink()
  172.  
  173.  
  174. def testNonZero():
  175.     dom = parse(tstfile)
  176.     confirm(dom)
  177.     dom.appendChild(dom.createComment('foo'))
  178.     confirm(not (dom.childNodes[-1].childNodes))
  179.     dom.unlink()
  180.  
  181.  
  182. def testUnlink():
  183.     dom = parse(tstfile)
  184.     dom.unlink()
  185.  
  186.  
  187. def testElement():
  188.     dom = Document()
  189.     dom.appendChild(dom.createElement('abc'))
  190.     confirm(dom.documentElement)
  191.     dom.unlink()
  192.  
  193.  
  194. def testAAA():
  195.     dom = parseString('<abc/>')
  196.     el = dom.documentElement
  197.     el.setAttribute('spam', 'jam2')
  198.     confirm(el.toxml() == '<abc spam="jam2"/>', 'testAAA')
  199.     a = el.getAttributeNode('spam')
  200.     confirm(a.ownerDocument is dom, 'setAttribute() sets ownerDocument')
  201.     confirm(a.ownerElement is dom.documentElement, 'setAttribute() sets ownerElement')
  202.     dom.unlink()
  203.  
  204.  
  205. def testAAB():
  206.     dom = parseString('<abc/>')
  207.     el = dom.documentElement
  208.     el.setAttribute('spam', 'jam')
  209.     el.setAttribute('spam', 'jam2')
  210.     confirm(el.toxml() == '<abc spam="jam2"/>', 'testAAB')
  211.     dom.unlink()
  212.  
  213.  
  214. def testAddAttr():
  215.     dom = Document()
  216.     child = dom.appendChild(dom.createElement('abc'))
  217.     child.setAttribute('def', 'ghi')
  218.     confirm(child.getAttribute('def') == 'ghi')
  219.     confirm(child.attributes['def'].value == 'ghi')
  220.     child.setAttribute('jkl', 'mno')
  221.     confirm(child.getAttribute('jkl') == 'mno')
  222.     confirm(child.attributes['jkl'].value == 'mno')
  223.     confirm(len(child.attributes) == 2)
  224.     child.setAttribute('def', 'newval')
  225.     confirm(child.getAttribute('def') == 'newval')
  226.     confirm(child.attributes['def'].value == 'newval')
  227.     confirm(len(child.attributes) == 2)
  228.     dom.unlink()
  229.  
  230.  
  231. def testDeleteAttr():
  232.     dom = Document()
  233.     child = dom.appendChild(dom.createElement('abc'))
  234.     confirm(len(child.attributes) == 0)
  235.     child.setAttribute('def', 'ghi')
  236.     confirm(len(child.attributes) == 1)
  237.     del child.attributes['def']
  238.     confirm(len(child.attributes) == 0)
  239.     dom.unlink()
  240.  
  241.  
  242. def testRemoveAttr():
  243.     dom = Document()
  244.     child = dom.appendChild(dom.createElement('abc'))
  245.     child.setAttribute('def', 'ghi')
  246.     confirm(len(child.attributes) == 1)
  247.     child.removeAttribute('def')
  248.     confirm(len(child.attributes) == 0)
  249.     dom.unlink()
  250.  
  251.  
  252. def testRemoveAttrNS():
  253.     dom = Document()
  254.     child = dom.appendChild(dom.createElementNS('http://www.python.org', 'python:abc'))
  255.     child.setAttributeNS('http://www.w3.org', 'xmlns:python', 'http://www.python.org')
  256.     child.setAttributeNS('http://www.python.org', 'python:abcattr', 'foo')
  257.     confirm(len(child.attributes) == 2)
  258.     child.removeAttributeNS('http://www.python.org', 'abcattr')
  259.     confirm(len(child.attributes) == 1)
  260.     dom.unlink()
  261.  
  262.  
  263. def testRemoveAttributeNode():
  264.     dom = Document()
  265.     child = dom.appendChild(dom.createElement('foo'))
  266.     child.setAttribute('spam', 'jam')
  267.     confirm(len(child.attributes) == 1)
  268.     node = child.getAttributeNode('spam')
  269.     child.removeAttributeNode(node)
  270.     if len(child.attributes) == 0:
  271.         pass
  272.     confirm(child.getAttributeNode('spam') is None)
  273.     dom.unlink()
  274.  
  275.  
  276. def testChangeAttr():
  277.     dom = parseString('<abc/>')
  278.     el = dom.documentElement
  279.     el.setAttribute('spam', 'jam')
  280.     confirm(len(el.attributes) == 1)
  281.     el.setAttribute('spam', 'bam')
  282.     el.setIdAttribute('spam')
  283.     if len(el.attributes) == 1 and el.attributes['spam'].value == 'bam' and el.attributes['spam'].nodeValue == 'bam' and el.getAttribute('spam') == 'bam':
  284.         pass
  285.     confirm(el.getAttributeNode('spam').isId)
  286.     el.attributes['spam'] = 'ham'
  287.     if len(el.attributes) == 1 and el.attributes['spam'].value == 'ham' and el.attributes['spam'].nodeValue == 'ham' and el.getAttribute('spam') == 'ham':
  288.         pass
  289.     confirm(el.attributes['spam'].isId)
  290.     el.setAttribute('spam2', 'bam')
  291.     if len(el.attributes) == 2 and el.attributes['spam'].value == 'ham' and el.attributes['spam'].nodeValue == 'ham' and el.getAttribute('spam') == 'ham' and el.attributes['spam2'].value == 'bam' and el.attributes['spam2'].nodeValue == 'bam':
  292.         pass
  293.     confirm(el.getAttribute('spam2') == 'bam')
  294.     el.attributes['spam2'] = 'bam2'
  295.     if len(el.attributes) == 2 and el.attributes['spam'].value == 'ham' and el.attributes['spam'].nodeValue == 'ham' and el.getAttribute('spam') == 'ham' and el.attributes['spam2'].value == 'bam2' and el.attributes['spam2'].nodeValue == 'bam2':
  296.         pass
  297.     confirm(el.getAttribute('spam2') == 'bam2')
  298.     dom.unlink()
  299.  
  300.  
  301. def testGetAttrList():
  302.     pass
  303.  
  304.  
  305. def testGetAttrValues():
  306.     pass
  307.  
  308.  
  309. def testGetAttrLength():
  310.     pass
  311.  
  312.  
  313. def testGetAttribute():
  314.     pass
  315.  
  316.  
  317. def testGetAttributeNS():
  318.     pass
  319.  
  320.  
  321. def testGetAttributeNode():
  322.     pass
  323.  
  324.  
  325. def testGetElementsByTagNameNS():
  326.     d = "<foo xmlns:minidom='http://pyxml.sf.net/minidom'>\n    <minidom:myelem/>\n    </foo>"
  327.     dom = parseString(d)
  328.     elems = dom.getElementsByTagNameNS('http://pyxml.sf.net/minidom', 'myelem')
  329.     if len(elems) == 1 and elems[0].namespaceURI == 'http://pyxml.sf.net/minidom' and elems[0].localName == 'myelem' and elems[0].prefix == 'minidom' and elems[0].tagName == 'minidom:myelem':
  330.         pass
  331.     confirm(elems[0].nodeName == 'minidom:myelem')
  332.     dom.unlink()
  333.  
  334.  
  335. def get_empty_nodelist_from_elements_by_tagName_ns_helper(doc, nsuri, lname):
  336.     nodelist = doc.getElementsByTagNameNS(nsuri, lname)
  337.     confirm(len(nodelist) == 0)
  338.  
  339.  
  340. def testGetEmptyNodeListFromElementsByTagNameNS():
  341.     doc = parseString('<doc/>')
  342.     get_empty_nodelist_from_elements_by_tagName_ns_helper(doc, 'http://xml.python.org/namespaces/a', 'localname')
  343.     get_empty_nodelist_from_elements_by_tagName_ns_helper(doc, '*', 'splat')
  344.     get_empty_nodelist_from_elements_by_tagName_ns_helper(doc, 'http://xml.python.org/namespaces/a', '*')
  345.     doc = parseString('<doc xmlns="http://xml.python.org/splat"><e/></doc>')
  346.     get_empty_nodelist_from_elements_by_tagName_ns_helper(doc, 'http://xml.python.org/splat', 'not-there')
  347.     get_empty_nodelist_from_elements_by_tagName_ns_helper(doc, '*', 'not-there')
  348.     get_empty_nodelist_from_elements_by_tagName_ns_helper(doc, 'http://somewhere.else.net/not-there', 'e')
  349.  
  350.  
  351. def testElementReprAndStr():
  352.     dom = Document()
  353.     el = dom.appendChild(dom.createElement('abc'))
  354.     string1 = repr(el)
  355.     string2 = str(el)
  356.     confirm(string1 == string2)
  357.     dom.unlink()
  358.  
  359.  
  360. def _testElementReprAndStrUnicode():
  361.     dom = Document()
  362.     el = dom.appendChild(dom.createElement(u'abc'))
  363.     string1 = repr(el)
  364.     string2 = str(el)
  365.     confirm(string1 == string2)
  366.     dom.unlink()
  367.  
  368.  
  369. def _testElementReprAndStrUnicodeNS():
  370.     dom = Document()
  371.     el = dom.appendChild(dom.createElementNS(u'http://www.slashdot.org', u'slash:abc'))
  372.     string1 = repr(el)
  373.     string2 = str(el)
  374.     confirm(string1 == string2)
  375.     confirm(string1.find('slash:abc') != -1)
  376.     dom.unlink()
  377.  
  378.  
  379. def testAttributeRepr():
  380.     dom = Document()
  381.     el = dom.appendChild(dom.createElement(u'abc'))
  382.     node = el.setAttribute('abc', 'def')
  383.     confirm(str(node) == repr(node))
  384.     dom.unlink()
  385.  
  386.  
  387. def testTextNodeRepr():
  388.     pass
  389.  
  390.  
  391. def testWriteXML():
  392.     str = '<?xml version="1.0" ?><a b="c"/>'
  393.     dom = parseString(str)
  394.     domstr = dom.toxml()
  395.     dom.unlink()
  396.     confirm(str == domstr)
  397.  
  398.  
  399. def testAltNewline():
  400.     str = '<?xml version="1.0" ?>\n<a b="c"/>\n'
  401.     dom = parseString(str)
  402.     domstr = dom.toprettyxml(newl = '\r\n')
  403.     dom.unlink()
  404.     confirm(domstr == str.replace('\n', '\r\n'))
  405.  
  406.  
  407. def testProcessingInstruction():
  408.     dom = parseString('<e><?mypi \t\n data \t\n ?></e>')
  409.     pi = dom.documentElement.firstChild
  410.     if pi.target == 'mypi' and pi.data == 'data \t\n ' and pi.nodeName == 'mypi' and pi.nodeType == Node.PROCESSING_INSTRUCTION_NODE and pi.attributes is None and not pi.hasChildNodes() and len(pi.childNodes) == 0 and pi.firstChild is None and pi.lastChild is None and pi.localName is None:
  411.         pass
  412.     confirm(pi.namespaceURI == xml.dom.EMPTY_NAMESPACE)
  413.  
  414.  
  415. def testProcessingInstructionRepr():
  416.     pass
  417.  
  418.  
  419. def testTextRepr():
  420.     pass
  421.  
  422.  
  423. def testWriteText():
  424.     pass
  425.  
  426.  
  427. def testDocumentElement():
  428.     pass
  429.  
  430.  
  431. def testTooManyDocumentElements():
  432.     doc = parseString('<doc/>')
  433.     elem = doc.createElement('extra')
  434.     
  435.     try:
  436.         doc.appendChild(elem)
  437.     except xml.dom.HierarchyRequestErr:
  438.         pass
  439.  
  440.     print 'Failed to catch expected exception when adding extra document element.'
  441.     elem.unlink()
  442.     doc.unlink()
  443.  
  444.  
  445. def testCreateElementNS():
  446.     pass
  447.  
  448.  
  449. def testCreateAttributeNS():
  450.     pass
  451.  
  452.  
  453. def testParse():
  454.     pass
  455.  
  456.  
  457. def testParseString():
  458.     pass
  459.  
  460.  
  461. def testComment():
  462.     pass
  463.  
  464.  
  465. def testAttrListItem():
  466.     pass
  467.  
  468.  
  469. def testAttrListItems():
  470.     pass
  471.  
  472.  
  473. def testAttrListItemNS():
  474.     pass
  475.  
  476.  
  477. def testAttrListKeys():
  478.     pass
  479.  
  480.  
  481. def testAttrListKeysNS():
  482.     pass
  483.  
  484.  
  485. def testRemoveNamedItem():
  486.     doc = parseString("<doc a=''/>")
  487.     e = doc.documentElement
  488.     attrs = e.attributes
  489.     a1 = e.getAttributeNode('a')
  490.     a2 = attrs.removeNamedItem('a')
  491.     confirm(a1.isSameNode(a2))
  492.     
  493.     try:
  494.         attrs.removeNamedItem('a')
  495.     except xml.dom.NotFoundErr:
  496.         pass
  497.  
  498.  
  499.  
  500. def testRemoveNamedItemNS():
  501.     doc = parseString("<doc xmlns:a='http://xml.python.org/' a:b=''/>")
  502.     e = doc.documentElement
  503.     attrs = e.attributes
  504.     a1 = e.getAttributeNodeNS('http://xml.python.org/', 'b')
  505.     a2 = attrs.removeNamedItemNS('http://xml.python.org/', 'b')
  506.     confirm(a1.isSameNode(a2))
  507.     
  508.     try:
  509.         attrs.removeNamedItemNS('http://xml.python.org/', 'b')
  510.     except xml.dom.NotFoundErr:
  511.         pass
  512.  
  513.  
  514.  
  515. def testAttrListValues():
  516.     pass
  517.  
  518.  
  519. def testAttrListLength():
  520.     pass
  521.  
  522.  
  523. def testAttrList__getitem__():
  524.     pass
  525.  
  526.  
  527. def testAttrList__setitem__():
  528.     pass
  529.  
  530.  
  531. def testSetAttrValueandNodeValue():
  532.     pass
  533.  
  534.  
  535. def testParseElement():
  536.     pass
  537.  
  538.  
  539. def testParseAttributes():
  540.     pass
  541.  
  542.  
  543. def testParseElementNamespaces():
  544.     pass
  545.  
  546.  
  547. def testParseAttributeNamespaces():
  548.     pass
  549.  
  550.  
  551. def testParseProcessingInstructions():
  552.     pass
  553.  
  554.  
  555. def testChildNodes():
  556.     pass
  557.  
  558.  
  559. def testFirstChild():
  560.     pass
  561.  
  562.  
  563. def testHasChildNodes():
  564.     pass
  565.  
  566.  
  567. def testCloneElementShallow():
  568.     (dom, clone) = _setupCloneElement(0)
  569.     if len(clone.childNodes) == 0 and clone.childNodes.length == 0 and clone.parentNode is None:
  570.         pass
  571.     confirm(clone.toxml() == '<doc attr="value"/>', 'testCloneElementShallow')
  572.     dom.unlink()
  573.  
  574.  
  575. def testCloneElementDeep():
  576.     (dom, clone) = _setupCloneElement(1)
  577.     if len(clone.childNodes) == 1 and clone.childNodes.length == 1 and clone.parentNode is None:
  578.         pass
  579.     confirm(clone.toxml() == '<doc attr="value"><foo/></doc>', 'testCloneElementDeep')
  580.     dom.unlink()
  581.  
  582.  
  583. def _setupCloneElement(deep):
  584.     dom = parseString("<doc attr='value'><foo/></doc>")
  585.     root = dom.documentElement
  586.     clone = root.cloneNode(deep)
  587.     if not deep or 'Deep':
  588.         pass
  589.     _testCloneElementCopiesAttributes(root, clone, 'testCloneElement' + 'Shallow')
  590.     root.tagName = root.nodeName = 'MODIFIED'
  591.     root.setAttribute('attr', 'NEW VALUE')
  592.     root.setAttribute('added', 'VALUE')
  593.     return (dom, clone)
  594.  
  595.  
  596. def _testCloneElementCopiesAttributes(e1, e2, test):
  597.     attrs1 = e1.attributes
  598.     attrs2 = e2.attributes
  599.     keys1 = attrs1.keys()
  600.     keys2 = attrs2.keys()
  601.     keys1.sort()
  602.     keys2.sort()
  603.     confirm(keys1 == keys2, 'clone of element has same attribute keys')
  604.     for i in range(len(keys1)):
  605.         a1 = attrs1.item(i)
  606.         a2 = attrs2.item(i)
  607.         if a1 is not a2 and a1.value == a2.value and a1.nodeValue == a2.nodeValue and a1.namespaceURI == a2.namespaceURI:
  608.             pass
  609.         confirm(a1.localName == a2.localName, 'clone of attribute node has proper attribute values')
  610.         confirm(a2.ownerElement is e2, 'clone of attribute node correctly owned')
  611.     
  612.  
  613.  
  614. def testCloneDocumentShallow():
  615.     doc = parseString("<?xml version='1.0'?>\n<!-- comment --><!DOCTYPE doc [\n<!NOTATION notation SYSTEM 'http://xml.python.org/'>\n]>\n<doc attr='value'/>")
  616.     doc2 = doc.cloneNode(0)
  617.     confirm(doc2 is None, 'testCloneDocumentShallow: shallow cloning of documents makes no sense!')
  618.  
  619.  
  620. def testCloneDocumentDeep():
  621.     doc = parseString("<?xml version='1.0'?>\n<!-- comment --><!DOCTYPE doc [\n<!NOTATION notation SYSTEM 'http://xml.python.org/'>\n]>\n<doc attr='value'/>")
  622.     doc2 = doc.cloneNode(1)
  623.     if not doc.isSameNode(doc2):
  624.         pass
  625.     confirm(not doc2.isSameNode(doc), 'testCloneDocumentDeep: document objects not distinct')
  626.     confirm(len(doc.childNodes) == len(doc2.childNodes), 'testCloneDocumentDeep: wrong number of Document children')
  627.     confirm(doc2.documentElement.nodeType == Node.ELEMENT_NODE, 'testCloneDocumentDeep: documentElement not an ELEMENT_NODE')
  628.     confirm(doc2.documentElement.ownerDocument.isSameNode(doc2), 'testCloneDocumentDeep: documentElement owner is not new document')
  629.     confirm(not doc.documentElement.isSameNode(doc2.documentElement), 'testCloneDocumentDeep: documentElement should not be shared')
  630.     if doc.doctype is not None:
  631.         confirm(doc2.doctype.nodeType == Node.DOCUMENT_TYPE_NODE, 'testCloneDocumentDeep: doctype not a DOCUMENT_TYPE_NODE')
  632.         confirm(doc2.doctype.ownerDocument.isSameNode(doc2))
  633.         confirm(not doc.doctype.isSameNode(doc2.doctype))
  634.     
  635.  
  636.  
  637. def testCloneDocumentTypeDeepOk():
  638.     doctype = create_nonempty_doctype()
  639.     clone = doctype.cloneNode(1)
  640.     if clone is not None and clone.nodeName == doctype.nodeName and clone.name == doctype.name and clone.publicId == doctype.publicId and clone.systemId == doctype.systemId and len(clone.entities) == len(doctype.entities) and clone.entities.item(len(clone.entities)) is None and len(clone.notations) == len(doctype.notations) and clone.notations.item(len(clone.notations)) is None:
  641.         pass
  642.     confirm(len(clone.childNodes) == 0)
  643.     for i in range(len(doctype.entities)):
  644.         se = doctype.entities.item(i)
  645.         ce = clone.entities.item(i)
  646.         if not se.isSameNode(ce) and not ce.isSameNode(se) and ce.nodeName == se.nodeName and ce.notationName == se.notationName and ce.publicId == se.publicId and ce.systemId == se.systemId and ce.encoding == se.encoding and ce.actualEncoding == se.actualEncoding:
  647.             pass
  648.         confirm(ce.version == se.version)
  649.     
  650.     for i in range(len(doctype.notations)):
  651.         sn = doctype.notations.item(i)
  652.         cn = clone.notations.item(i)
  653.         if not sn.isSameNode(cn) and not cn.isSameNode(sn) and cn.nodeName == sn.nodeName and cn.publicId == sn.publicId:
  654.             pass
  655.         confirm(cn.systemId == sn.systemId)
  656.     
  657.  
  658.  
  659. def testCloneDocumentTypeDeepNotOk():
  660.     doc = create_doc_with_doctype()
  661.     clone = doc.doctype.cloneNode(1)
  662.     confirm(clone is None, 'testCloneDocumentTypeDeepNotOk')
  663.  
  664.  
  665. def testCloneDocumentTypeShallowOk():
  666.     doctype = create_nonempty_doctype()
  667.     clone = doctype.cloneNode(0)
  668.     if clone is not None and clone.nodeName == doctype.nodeName and clone.name == doctype.name and clone.publicId == doctype.publicId and clone.systemId == doctype.systemId and len(clone.entities) == 0 and clone.entities.item(0) is None and len(clone.notations) == 0 and clone.notations.item(0) is None:
  669.         pass
  670.     confirm(len(clone.childNodes) == 0)
  671.  
  672.  
  673. def testCloneDocumentTypeShallowNotOk():
  674.     doc = create_doc_with_doctype()
  675.     clone = doc.doctype.cloneNode(0)
  676.     confirm(clone is None, 'testCloneDocumentTypeShallowNotOk')
  677.  
  678.  
  679. def check_import_document(deep, testName):
  680.     doc1 = parseString('<doc/>')
  681.     doc2 = parseString('<doc/>')
  682.     
  683.     try:
  684.         doc1.importNode(doc2, deep)
  685.     except xml.dom.NotSupportedErr:
  686.         pass
  687.  
  688.     raise Exception(testName + ': expected NotSupportedErr when importing a document')
  689.  
  690.  
  691. def testImportDocumentShallow():
  692.     check_import_document(0, 'testImportDocumentShallow')
  693.  
  694.  
  695. def testImportDocumentDeep():
  696.     check_import_document(1, 'testImportDocumentDeep')
  697.  
  698.  
  699. def create_doc_without_doctype(doctype = None):
  700.     return getDOMImplementation().createDocument(None, 'doc', doctype)
  701.  
  702.  
  703. def create_nonempty_doctype():
  704.     doctype = getDOMImplementation().createDocumentType('doc', None, None)
  705.     doctype.entities._seq = []
  706.     doctype.notations._seq = []
  707.     notation = xml.dom.minidom.Notation('my-notation', None, 'http://xml.python.org/notations/my')
  708.     doctype.notations._seq.append(notation)
  709.     entity = xml.dom.minidom.Entity('my-entity', None, 'http://xml.python.org/entities/my', 'my-notation')
  710.     entity.version = '1.0'
  711.     entity.encoding = 'utf-8'
  712.     entity.actualEncoding = 'us-ascii'
  713.     doctype.entities._seq.append(entity)
  714.     return doctype
  715.  
  716.  
  717. def create_doc_with_doctype():
  718.     doctype = create_nonempty_doctype()
  719.     doc = create_doc_without_doctype(doctype)
  720.     doctype.entities.item(0).ownerDocument = doc
  721.     doctype.notations.item(0).ownerDocument = doc
  722.     return doc
  723.  
  724.  
  725. def testImportDocumentTypeShallow():
  726.     src = create_doc_with_doctype()
  727.     target = create_doc_without_doctype()
  728.     
  729.     try:
  730.         imported = target.importNode(src.doctype, 0)
  731.     except xml.dom.NotSupportedErr:
  732.         pass
  733.  
  734.     raise Exception('testImportDocumentTypeShallow: expected NotSupportedErr')
  735.  
  736.  
  737. def testImportDocumentTypeDeep():
  738.     src = create_doc_with_doctype()
  739.     target = create_doc_without_doctype()
  740.     
  741.     try:
  742.         imported = target.importNode(src.doctype, 1)
  743.     except xml.dom.NotSupportedErr:
  744.         pass
  745.  
  746.     raise Exception('testImportDocumentTypeDeep: expected NotSupportedErr')
  747.  
  748.  
  749. def check_clone_attribute(deep, testName):
  750.     doc = parseString("<doc attr='value'/>")
  751.     attr = doc.documentElement.getAttributeNode('attr')
  752.     if not attr is not None:
  753.         raise AssertionError
  754.     clone = attr.cloneNode(deep)
  755.     confirm(not clone.isSameNode(attr))
  756.     confirm(not attr.isSameNode(clone))
  757.     confirm(clone.ownerElement is None, testName + ': ownerElement should be None')
  758.     confirm(clone.ownerDocument.isSameNode(attr.ownerDocument), testName + ': ownerDocument does not match')
  759.     confirm(clone.specified, testName + ': cloned attribute must have specified == True')
  760.  
  761.  
  762. def testCloneAttributeShallow():
  763.     check_clone_attribute(0, 'testCloneAttributeShallow')
  764.  
  765.  
  766. def testCloneAttributeDeep():
  767.     check_clone_attribute(1, 'testCloneAttributeDeep')
  768.  
  769.  
  770. def check_clone_pi(deep, testName):
  771.     doc = parseString('<?target data?><doc/>')
  772.     pi = doc.firstChild
  773.     if not pi.nodeType == Node.PROCESSING_INSTRUCTION_NODE:
  774.         raise AssertionError
  775.     clone = pi.cloneNode(deep)
  776.     if clone.target == pi.target:
  777.         pass
  778.     confirm(clone.data == pi.data)
  779.  
  780.  
  781. def testClonePIShallow():
  782.     check_clone_pi(0, 'testClonePIShallow')
  783.  
  784.  
  785. def testClonePIDeep():
  786.     check_clone_pi(1, 'testClonePIDeep')
  787.  
  788.  
  789. def testNormalize():
  790.     doc = parseString('<doc/>')
  791.     root = doc.documentElement
  792.     root.appendChild(doc.createTextNode('first'))
  793.     root.appendChild(doc.createTextNode('second'))
  794.     if len(root.childNodes) == 2:
  795.         pass
  796.     confirm(root.childNodes.length == 2, 'testNormalize -- preparation')
  797.     doc.normalize()
  798.     if len(root.childNodes) == 1 and root.childNodes.length == 1 and root.firstChild is root.lastChild:
  799.         pass
  800.     confirm(root.firstChild.data == 'firstsecond', 'testNormalize -- result')
  801.     doc.unlink()
  802.     doc = parseString('<doc/>')
  803.     root = doc.documentElement
  804.     root.appendChild(doc.createTextNode(''))
  805.     doc.normalize()
  806.     if len(root.childNodes) == 0:
  807.         pass
  808.     confirm(root.childNodes.length == 0, 'testNormalize -- single empty node removed')
  809.     doc.unlink()
  810.  
  811.  
  812. def testSiblings():
  813.     doc = parseString('<doc><?pi?>text?<elm/></doc>')
  814.     root = doc.documentElement
  815.     (pi, text, elm) = root.childNodes
  816.     if pi.nextSibling is text and pi.previousSibling is None and text.nextSibling is elm and text.previousSibling is pi and elm.nextSibling is None:
  817.         pass
  818.     confirm(elm.previousSibling is text, 'testSiblings')
  819.     doc.unlink()
  820.  
  821.  
  822. def testParents():
  823.     doc = parseString('<doc><elm1><elm2/><elm2><elm3/></elm2></elm1></doc>')
  824.     root = doc.documentElement
  825.     elm1 = root.childNodes[0]
  826.     (elm2a, elm2b) = elm1.childNodes
  827.     elm3 = elm2b.childNodes[0]
  828.     if root.parentNode is doc and elm1.parentNode is root and elm2a.parentNode is elm1 and elm2b.parentNode is elm1:
  829.         pass
  830.     confirm(elm3.parentNode is elm2b, 'testParents')
  831.     doc.unlink()
  832.  
  833.  
  834. def testNodeListItem():
  835.     doc = parseString('<doc><e/><e/></doc>')
  836.     children = doc.childNodes
  837.     docelem = children[0]
  838.     if children[0] is children.item(0) and children.item(1) is None and docelem.childNodes.item(0) is docelem.childNodes[0] and docelem.childNodes.item(1) is docelem.childNodes[1]:
  839.         pass
  840.     confirm(docelem.childNodes.item(0).childNodes.item(0) is None, 'test NodeList.item()')
  841.     doc.unlink()
  842.  
  843.  
  844. def testSAX2DOM():
  845.     pulldom = pulldom
  846.     import xml.dom
  847.     sax2dom = pulldom.SAX2DOM()
  848.     sax2dom.startDocument()
  849.     sax2dom.startElement('doc', { })
  850.     sax2dom.characters('text')
  851.     sax2dom.startElement('subelm', { })
  852.     sax2dom.characters('text')
  853.     sax2dom.endElement('subelm')
  854.     sax2dom.characters('text')
  855.     sax2dom.endElement('doc')
  856.     sax2dom.endDocument()
  857.     doc = sax2dom.document
  858.     root = doc.documentElement
  859.     (text1, elm1, text2) = root.childNodes
  860.     text3 = elm1.childNodes[0]
  861.     if text1.previousSibling is None and text1.nextSibling is elm1 and elm1.previousSibling is text1 and elm1.nextSibling is text2 and text2.previousSibling is elm1 and text2.nextSibling is None and text3.previousSibling is None:
  862.         pass
  863.     confirm(text3.nextSibling is None, 'testSAX2DOM - siblings')
  864.     if root.parentNode is doc and text1.parentNode is root and elm1.parentNode is root and text2.parentNode is root:
  865.         pass
  866.     confirm(text3.parentNode is elm1, 'testSAX2DOM - parents')
  867.     doc.unlink()
  868.  
  869.  
  870. def testEncodings():
  871.     doc = parseString('<foo>€</foo>')
  872.     if doc.toxml() == u'<?xml version="1.0" ?><foo>\xe2\x82\xac</foo>' and doc.toxml('utf-8') == '<?xml version="1.0" encoding="utf-8"?><foo>\xe2\x82\xac</foo>':
  873.         pass
  874.     confirm(doc.toxml('iso-8859-15') == '<?xml version="1.0" encoding="iso-8859-15"?><foo>\xa4</foo>', 'testEncodings - encoding EURO SIGN')
  875.     doc.unlink()
  876.  
  877.  
  878. class UserDataHandler:
  879.     called = 0
  880.     
  881.     def handle(self, operation, key, data, src, dst):
  882.         dst.setUserData(key, data + 1, self)
  883.         src.setUserData(key, None, None)
  884.         self.called = 1
  885.  
  886.  
  887.  
  888. def testUserData():
  889.     dom = Document()
  890.     n = dom.createElement('e')
  891.     confirm(n.getUserData('foo') is None)
  892.     n.setUserData('foo', None, None)
  893.     confirm(n.getUserData('foo') is None)
  894.     n.setUserData('foo', 12, 12)
  895.     n.setUserData('bar', 13, 13)
  896.     confirm(n.getUserData('foo') == 12)
  897.     confirm(n.getUserData('bar') == 13)
  898.     n.setUserData('foo', None, None)
  899.     confirm(n.getUserData('foo') is None)
  900.     confirm(n.getUserData('bar') == 13)
  901.     handler = UserDataHandler()
  902.     n.setUserData('bar', 12, handler)
  903.     c = n.cloneNode(1)
  904.     if handler.called and n.getUserData('bar') is None:
  905.         pass
  906.     confirm(c.getUserData('bar') == 13)
  907.     n.unlink()
  908.     c.unlink()
  909.     dom.unlink()
  910.  
  911.  
  912. def testRenameAttribute():
  913.     doc = parseString("<doc a='v'/>")
  914.     elem = doc.documentElement
  915.     attrmap = elem.attributes
  916.     attr = elem.attributes['a']
  917.     attr = doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, 'b')
  918.     if attr.name == 'b' and attr.nodeName == 'b' and attr.localName is None and attr.namespaceURI == xml.dom.EMPTY_NAMESPACE and attr.prefix is None and attr.value == 'v' and elem.getAttributeNode('a') is None and elem.getAttributeNode('b').isSameNode(attr) and attrmap['b'].isSameNode(attr) and attr.ownerDocument.isSameNode(doc):
  919.         pass
  920.     confirm(attr.ownerElement.isSameNode(elem))
  921.     attr = doc.renameNode(attr, 'http://xml.python.org/ns', 'c')
  922.     if attr.name == 'c' and attr.nodeName == 'c' and attr.localName == 'c' and attr.namespaceURI == 'http://xml.python.org/ns' and attr.prefix is None and attr.value == 'v' and elem.getAttributeNode('a') is None and elem.getAttributeNode('b') is None and elem.getAttributeNode('c').isSameNode(attr) and elem.getAttributeNodeNS('http://xml.python.org/ns', 'c').isSameNode(attr) and attrmap['c'].isSameNode(attr):
  923.         pass
  924.     confirm(attrmap[('http://xml.python.org/ns', 'c')].isSameNode(attr))
  925.     attr = doc.renameNode(attr, 'http://xml.python.org/ns2', 'p:d')
  926.     if attr.name == 'p:d' and attr.nodeName == 'p:d' and attr.localName == 'd' and attr.namespaceURI == 'http://xml.python.org/ns2' and attr.prefix == 'p' and attr.value == 'v' and elem.getAttributeNode('a') is None and elem.getAttributeNode('b') is None and elem.getAttributeNode('c') is None and elem.getAttributeNodeNS('http://xml.python.org/ns', 'c') is None and elem.getAttributeNode('p:d').isSameNode(attr) and elem.getAttributeNodeNS('http://xml.python.org/ns2', 'd').isSameNode(attr) and attrmap['p:d'].isSameNode(attr):
  927.         pass
  928.     confirm(attrmap[('http://xml.python.org/ns2', 'd')].isSameNode(attr))
  929.     attr = doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, 'e')
  930.     if attr.name == 'e' and attr.nodeName == 'e' and attr.localName is None and attr.namespaceURI == xml.dom.EMPTY_NAMESPACE and attr.prefix is None and attr.value == 'v' and elem.getAttributeNode('a') is None and elem.getAttributeNode('b') is None and elem.getAttributeNode('c') is None and elem.getAttributeNode('p:d') is None and elem.getAttributeNodeNS('http://xml.python.org/ns', 'c') is None and elem.getAttributeNode('e').isSameNode(attr):
  931.         pass
  932.     confirm(attrmap['e'].isSameNode(attr))
  933.     
  934.     try:
  935.         doc.renameNode(attr, 'http://xml.python.org/ns', 'xmlns')
  936.     except xml.dom.NamespaceErr:
  937.         pass
  938.  
  939.     print 'expected NamespaceErr'
  940.     checkRenameNodeSharedConstraints(doc, attr)
  941.     doc.unlink()
  942.  
  943.  
  944. def testRenameElement():
  945.     doc = parseString('<doc/>')
  946.     elem = doc.documentElement
  947.     elem = doc.renameNode(elem, xml.dom.EMPTY_NAMESPACE, 'a')
  948.     if elem.tagName == 'a' and elem.nodeName == 'a' and elem.localName is None and elem.namespaceURI == xml.dom.EMPTY_NAMESPACE and elem.prefix is None:
  949.         pass
  950.     confirm(elem.ownerDocument.isSameNode(doc))
  951.     elem = doc.renameNode(elem, 'http://xml.python.org/ns', 'b')
  952.     if elem.tagName == 'b' and elem.nodeName == 'b' and elem.localName == 'b' and elem.namespaceURI == 'http://xml.python.org/ns' and elem.prefix is None:
  953.         pass
  954.     confirm(elem.ownerDocument.isSameNode(doc))
  955.     elem = doc.renameNode(elem, 'http://xml.python.org/ns2', 'p:c')
  956.     if elem.tagName == 'p:c' and elem.nodeName == 'p:c' and elem.localName == 'c' and elem.namespaceURI == 'http://xml.python.org/ns2' and elem.prefix == 'p':
  957.         pass
  958.     confirm(elem.ownerDocument.isSameNode(doc))
  959.     elem = doc.renameNode(elem, xml.dom.EMPTY_NAMESPACE, 'd')
  960.     if elem.tagName == 'd' and elem.nodeName == 'd' and elem.localName is None and elem.namespaceURI == xml.dom.EMPTY_NAMESPACE and elem.prefix is None:
  961.         pass
  962.     confirm(elem.ownerDocument.isSameNode(doc))
  963.     checkRenameNodeSharedConstraints(doc, elem)
  964.     doc.unlink()
  965.  
  966.  
  967. def checkRenameNodeSharedConstraints(doc, node):
  968.     
  969.     try:
  970.         doc.renameNode(node, 'http://xml.python.org/ns', 'xmlns:foo')
  971.     except xml.dom.NamespaceErr:
  972.         pass
  973.  
  974.     print 'expected NamespaceErr'
  975.     doc2 = parseString('<doc/>')
  976.     
  977.     try:
  978.         doc2.renameNode(node, xml.dom.EMPTY_NAMESPACE, 'foo')
  979.     except xml.dom.WrongDocumentErr:
  980.         pass
  981.  
  982.     print 'expected WrongDocumentErr'
  983.  
  984.  
  985. def testRenameOther():
  986.     doc = xml.dom.minidom.getDOMImplementation().createDocument(xml.dom.EMPTY_NAMESPACE, 'e', None)
  987.     node = doc.createComment('comment')
  988.     
  989.     try:
  990.         doc.renameNode(node, xml.dom.EMPTY_NAMESPACE, 'foo')
  991.     except xml.dom.NotSupportedErr:
  992.         pass
  993.  
  994.     print 'expected NotSupportedErr when renaming comment node'
  995.     doc.unlink()
  996.  
  997.  
  998. def checkWholeText(node, s):
  999.     t = node.wholeText
  1000.     confirm(t == s, 'looking for %s, found %s' % (repr(s), repr(t)))
  1001.  
  1002.  
  1003. def testWholeText():
  1004.     doc = parseString('<doc>a</doc>')
  1005.     elem = doc.documentElement
  1006.     text = elem.childNodes[0]
  1007.     if not text.nodeType == Node.TEXT_NODE:
  1008.         raise AssertionError
  1009.     checkWholeText(text, 'a')
  1010.     elem.appendChild(doc.createTextNode('b'))
  1011.     checkWholeText(text, 'ab')
  1012.     elem.insertBefore(doc.createCDATASection('c'), text)
  1013.     checkWholeText(text, 'cab')
  1014.     splitter = doc.createComment('comment')
  1015.     elem.appendChild(splitter)
  1016.     text2 = doc.createTextNode('d')
  1017.     elem.appendChild(text2)
  1018.     checkWholeText(text, 'cab')
  1019.     checkWholeText(text2, 'd')
  1020.     x = doc.createElement('x')
  1021.     elem.replaceChild(x, splitter)
  1022.     splitter = x
  1023.     checkWholeText(text, 'cab')
  1024.     checkWholeText(text2, 'd')
  1025.     x = doc.createProcessingInstruction('y', 'z')
  1026.     elem.replaceChild(x, splitter)
  1027.     splitter = x
  1028.     checkWholeText(text, 'cab')
  1029.     checkWholeText(text2, 'd')
  1030.     elem.removeChild(splitter)
  1031.     checkWholeText(text, 'cabd')
  1032.     checkWholeText(text2, 'cabd')
  1033.  
  1034.  
  1035. def testReplaceWholeText():
  1036.     
  1037.     def setup():
  1038.         doc = parseString('<doc>a<e/>d</doc>')
  1039.         elem = doc.documentElement
  1040.         text1 = elem.firstChild
  1041.         text2 = elem.lastChild
  1042.         splitter = text1.nextSibling
  1043.         elem.insertBefore(doc.createTextNode('b'), splitter)
  1044.         elem.insertBefore(doc.createCDATASection('c'), text1)
  1045.         return (doc, elem, text1, splitter, text2)
  1046.  
  1047.     (doc, elem, text1, splitter, text2) = setup()
  1048.     text = text1.replaceWholeText('new content')
  1049.     checkWholeText(text, 'new content')
  1050.     checkWholeText(text2, 'd')
  1051.     confirm(len(elem.childNodes) == 3)
  1052.     (doc, elem, text1, splitter, text2) = setup()
  1053.     text = text2.replaceWholeText('new content')
  1054.     checkWholeText(text, 'new content')
  1055.     checkWholeText(text1, 'cab')
  1056.     confirm(len(elem.childNodes) == 5)
  1057.     (doc, elem, text1, splitter, text2) = setup()
  1058.     text = text1.replaceWholeText('')
  1059.     checkWholeText(text2, 'd')
  1060.     if text is None:
  1061.         pass
  1062.     confirm(len(elem.childNodes) == 2)
  1063.  
  1064.  
  1065. def testSchemaType():
  1066.     doc = parseString("<!DOCTYPE doc [\n  <!ENTITY e1 SYSTEM 'http://xml.python.org/e1'>\n  <!ENTITY e2 SYSTEM 'http://xml.python.org/e2'>\n  <!ATTLIST doc id   ID       #IMPLIED \n                ref  IDREF    #IMPLIED \n                refs IDREFS   #IMPLIED \n                enum (a|b)    #IMPLIED \n                ent  ENTITY   #IMPLIED \n                ents ENTITIES #IMPLIED \n                nm   NMTOKEN  #IMPLIED \n                nms  NMTOKENS #IMPLIED \n                text CDATA    #IMPLIED \n    >\n]><doc id='name' notid='name' text='splat!' enum='b'       ref='name' refs='name name' ent='e1' ents='e1 e2'       nm='123' nms='123 abc' />")
  1067.     elem = doc.documentElement
  1068.     t = elem.schemaType
  1069.     if t.name is None:
  1070.         pass
  1071.     confirm(t.namespace == xml.dom.EMPTY_NAMESPACE)
  1072.     names = 'id notid text enum ref refs ent ents nm nms'.split()
  1073.     for name in names:
  1074.         a = elem.getAttributeNode(name)
  1075.         t = a.schemaType
  1076.         if hasattr(t, 'name'):
  1077.             pass
  1078.         confirm(t.namespace == xml.dom.EMPTY_NAMESPACE)
  1079.     
  1080.  
  1081.  
  1082. def testSetIdAttribute():
  1083.     doc = parseString("<doc a1='v' a2='w'/>")
  1084.     e = doc.documentElement
  1085.     a1 = e.getAttributeNode('a1')
  1086.     a2 = e.getAttributeNode('a2')
  1087.     if doc.getElementById('v') is None and not (a1.isId):
  1088.         pass
  1089.     confirm(not (a2.isId))
  1090.     e.setIdAttribute('a1')
  1091.     if e.isSameNode(doc.getElementById('v')) and a1.isId:
  1092.         pass
  1093.     confirm(not (a2.isId))
  1094.     e.setIdAttribute('a2')
  1095.     if e.isSameNode(doc.getElementById('v')) and e.isSameNode(doc.getElementById('w')) and a1.isId:
  1096.         pass
  1097.     confirm(a2.isId)
  1098.     a3 = doc.createAttribute('a1')
  1099.     a3.value = 'v'
  1100.     e.setAttributeNode(a3)
  1101.     if doc.getElementById('v') is None and e.isSameNode(doc.getElementById('w')) and not (a1.isId) and a2.isId:
  1102.         pass
  1103.     confirm(not (a3.isId))
  1104.     doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, 'an')
  1105.     if e.isSameNode(doc.getElementById('w')):
  1106.         pass
  1107.     confirm(a2.isId)
  1108.  
  1109.  
  1110. def testSetIdAttributeNS():
  1111.     NS1 = 'http://xml.python.org/ns1'
  1112.     NS2 = 'http://xml.python.org/ns2'
  1113.     doc = parseString("<doc xmlns:ns1='" + NS1 + "' xmlns:ns2='" + NS2 + "' ns1:a1='v' ns2:a2='w'/>")
  1114.     e = doc.documentElement
  1115.     a1 = e.getAttributeNodeNS(NS1, 'a1')
  1116.     a2 = e.getAttributeNodeNS(NS2, 'a2')
  1117.     if doc.getElementById('v') is None and not (a1.isId):
  1118.         pass
  1119.     confirm(not (a2.isId))
  1120.     e.setIdAttributeNS(NS1, 'a1')
  1121.     if e.isSameNode(doc.getElementById('v')) and a1.isId:
  1122.         pass
  1123.     confirm(not (a2.isId))
  1124.     e.setIdAttributeNS(NS2, 'a2')
  1125.     if e.isSameNode(doc.getElementById('v')) and e.isSameNode(doc.getElementById('w')) and a1.isId:
  1126.         pass
  1127.     confirm(a2.isId)
  1128.     a3 = doc.createAttributeNS(NS1, 'a1')
  1129.     a3.value = 'v'
  1130.     e.setAttributeNode(a3)
  1131.     confirm(e.isSameNode(doc.getElementById('w')))
  1132.     confirm(not (a1.isId))
  1133.     confirm(a2.isId)
  1134.     confirm(not (a3.isId))
  1135.     confirm(doc.getElementById('v') is None)
  1136.     doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, 'an')
  1137.     if e.isSameNode(doc.getElementById('w')):
  1138.         pass
  1139.     confirm(a2.isId)
  1140.  
  1141.  
  1142. def testSetIdAttributeNode():
  1143.     NS1 = 'http://xml.python.org/ns1'
  1144.     NS2 = 'http://xml.python.org/ns2'
  1145.     doc = parseString("<doc xmlns:ns1='" + NS1 + "' xmlns:ns2='" + NS2 + "' ns1:a1='v' ns2:a2='w'/>")
  1146.     e = doc.documentElement
  1147.     a1 = e.getAttributeNodeNS(NS1, 'a1')
  1148.     a2 = e.getAttributeNodeNS(NS2, 'a2')
  1149.     if doc.getElementById('v') is None and not (a1.isId):
  1150.         pass
  1151.     confirm(not (a2.isId))
  1152.     e.setIdAttributeNode(a1)
  1153.     if e.isSameNode(doc.getElementById('v')) and a1.isId:
  1154.         pass
  1155.     confirm(not (a2.isId))
  1156.     e.setIdAttributeNode(a2)
  1157.     if e.isSameNode(doc.getElementById('v')) and e.isSameNode(doc.getElementById('w')) and a1.isId:
  1158.         pass
  1159.     confirm(a2.isId)
  1160.     a3 = doc.createAttributeNS(NS1, 'a1')
  1161.     a3.value = 'v'
  1162.     e.setAttributeNode(a3)
  1163.     confirm(e.isSameNode(doc.getElementById('w')))
  1164.     confirm(not (a1.isId))
  1165.     confirm(a2.isId)
  1166.     confirm(not (a3.isId))
  1167.     confirm(doc.getElementById('v') is None)
  1168.     doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, 'an')
  1169.     if e.isSameNode(doc.getElementById('w')):
  1170.         pass
  1171.     confirm(a2.isId)
  1172.  
  1173.  
  1174. def testPickledDocument():
  1175.     doc = parseString("<?xml version='1.0' encoding='us-ascii'?>\n<!DOCTYPE doc PUBLIC 'http://xml.python.org/public' 'http://xml.python.org/system' [\n  <!ELEMENT e EMPTY>\n  <!ENTITY ent SYSTEM 'http://xml.python.org/entity'>\n]><doc attr='value'> text\n<?pi sample?> <!-- comment --> <e/> </doc>")
  1176.     s = pickle.dumps(doc)
  1177.     doc2 = pickle.loads(s)
  1178.     stack = [
  1179.         (doc, doc2)]
  1180.     while stack:
  1181.         (n1, n2) = stack.pop()
  1182.         if n1.nodeType == n2.nodeType and len(n1.childNodes) == len(n2.childNodes) and n1.nodeName == n2.nodeName and not n1.isSameNode(n2):
  1183.             pass
  1184.         confirm(not n2.isSameNode(n1))
  1185.         if n1.nodeType == Node.DOCUMENT_TYPE_NODE:
  1186.             len(n1.entities)
  1187.             len(n2.entities)
  1188.             len(n1.notations)
  1189.             len(n2.notations)
  1190.             if len(n1.entities) == len(n2.entities):
  1191.                 pass
  1192.             confirm(len(n1.notations) == len(n2.notations))
  1193.             for i in range(len(n1.notations)):
  1194.                 no1 = n1.notations.item(i)
  1195.                 no2 = n1.notations.item(i)
  1196.                 if no1.name == no2.name and no1.publicId == no2.publicId:
  1197.                     pass
  1198.                 confirm(no1.systemId == no2.systemId)
  1199.                 statck.append((no1, no2))
  1200.             
  1201.             for i in range(len(n1.entities)):
  1202.                 e1 = n1.entities.item(i)
  1203.                 e2 = n2.entities.item(i)
  1204.                 if e1.notationName == e2.notationName and e1.publicId == e2.publicId:
  1205.                     pass
  1206.                 confirm(e1.systemId == e2.systemId)
  1207.                 stack.append((e1, e2))
  1208.             
  1209.         
  1210.         if n1.nodeType != Node.DOCUMENT_NODE:
  1211.             if n1.ownerDocument.isSameNode(doc):
  1212.                 pass
  1213.             confirm(n2.ownerDocument.isSameNode(doc2))
  1214.         
  1215.         for i in range(len(n1.childNodes)):
  1216.             stack.append((n1.childNodes[i], n2.childNodes[i]))
  1217.         
  1218.  
  1219. names = globals().keys()
  1220. names.sort()
  1221. failed = []
  1222.  
  1223. try:
  1224.     Node.allnodes
  1225. except AttributeError:
  1226.     
  1227.     def check_allnodes():
  1228.         pass
  1229.  
  1230.  
  1231.  
  1232. def check_allnodes():
  1233.     confirm(len(Node.allnodes) == 0, 'assertion: len(Node.allnodes) == 0')
  1234.     if len(Node.allnodes):
  1235.         print 'Garbage left over:'
  1236.         if verbose:
  1237.             print Node.allnodes.items()[0:10]
  1238.         else:
  1239.             print len(Node.allnodes)
  1240.     
  1241.     Node.allnodes = { }
  1242.  
  1243. for name in names:
  1244.     if name.startswith('test'):
  1245.         func = globals()[name]
  1246.         
  1247.         try:
  1248.             func()
  1249.             check_allnodes()
  1250.         failed.append(name)
  1251.         print 'Test Failed: ', name
  1252.         sys.stdout.flush()
  1253.         traceback.print_exception(*sys.exc_info())
  1254.         print repr(sys.exc_info()[1])
  1255.         Node.allnodes = { }
  1256.  
  1257.         continue
  1258.  
  1259. if failed:
  1260.     print '\n\n\n**** Check for failures in these tests:'
  1261.     for name in failed:
  1262.         print '  ' + name
  1263.     
  1264.  
  1265.